

// 引入操作 cookie的工具模块
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
// 引入 登录
import { userLogin, getUserInfo, getUserPhoto } from '@/api/user'

import { resetRouter } from "@/router"

// 状态
const state = {
  // 设置token的初始状态
  token: getToken() || null,
  userInfo: {} // 定义一个空的对象 在getters 做快捷访问， null 会报错
}


// 修改状态
const mutations = {
  // 定义对象属性 和 上面接收的函数不是一个
  setToken(state, token) {
    state.token = token  // 修改当前
    setToken(token)      // 存到本地
  },
  // 删除 token
  removeToken(state, token) {
    state.token = null;
    // 调用删除本地的 token
    removeToken()
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = { ...userInfo } // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
  },
  // 删除用户信息
  reomveUserInfo(state) {
    state.userInfo = {}
  }
}



// 执行异步
const actions = {
  // 获取token
  async login(context, data) {
    //  接收 直接把传入的参数 传递下去
    try {
      const result = await userLogin(data);
      context.commit('setToken', result)
      setTimeStamp();   // 设置时间戳
    } catch (error) {
      return Promise.reject(new Error(error.message));
    }
    // 成功 修改 token 的值
    // 在 request 响应拦截器 做了业务逻辑 直接返回成功的
  },

  // 获取用户资料action
  async getUserInfo(context) {
    const result = await getUserInfo()  // 获取返回值
    const obj = await getUserPhoto(result.userId);   // 获取头像等信息
    context.commit('setUserInfo', { ...result, ...obj }) // 将整个的个人信息设置到用户的vuex数据中
    return result // 这里为什么要返回  给后面权限埋下伏笔 就是弄动态路由用的 在全局beforeEach
  },

  // 删除用户资料和token
  logout(context) {
    context.commit('removeToken');
    context.commit('reomveUserInfo');
    // 重置路由
    resetRouter();

    // 把本地保存的动态路由设置为  null  在一个模块 user 调用另一个模块 permission 的方法
    context.commit('permission/setRoutes', [], { root: true })

  }

}



export default {
  namespaced: true,
  state,
  mutations,
  actions,
}
